// reduce 方法(回调函数,初始值)     累加器：将数组中所有的元素累加

const arr = [1, 2, 3, 4]

//  无初始值  会将第一个数作为初始值
console.log(arr.reduce((prev, item) => {
    return prev + item
}))  // 10

/**  
 * 第一次循环 : prev  1  item  2  返回值  3
 * 第二次循环 : prev  3  item  3  返回值  6
 * 第三次循环 : prev  6  item  4  返回值  10
 */

// 初始值 10
console.log(arr.reduce((prev, item) => {
    return prev + item
}, 10))  // 20

/**
 * 第一次循环 : prev  10  item  1  返回值  11
 * 第二次循环 : prev  11  item  2  返回值  13
 * 第三次循环 : prev  13  item  3  返回值  16
 * 第四次循环 : prev  16  item  4  返回值  20
 */


// 薪资求和  对象数组求和
const money = [
    {
        name: '张三',
        salary: 10000
    },
    {
        name: '李四',
        salary: 12000
    },
    {
        name: '王五',
        salary: 16000
    },
]
const sum = money.reduce(((prev, item) => {
    return prev + item.salary
}))
console.log(sum) // [object Object]1200016000

/**
 * [object Object]1200016000
 * 原因 ：由于是对象数组，如果不传入初始值，则第一次 prev 是对象
 * 进行累加会导致字符串拼接，无法正确求和
 */

// 解决  必须传入 初始值

const sum2 = money.reduce(((prev, item) => {
    return prev + item.salary
}), 0)
console.log(sum2) // 38000


// join  拼接字符串

// indexOf 查找数组里的元素 找到就返回目标的索引值  没找到就返回 -1
const arr1 = [10, 20, 30, 40, 50]
console.log(arr1.indexOf(20)) // 1
console.log(arr1.indexOf(100)) // -1

// findIndex(回调函数)  查找数组里的元素 ，返回索引值  没找到就返回 -1  可以查找任意数据
/**
 * 原理：会遍历一遍数据，遍历时执行回调函数，找到元素后会终止循环，提高效率
 */
const index = arr1.findIndex((item, index) => {
    console.log(item, index)
    // 10 0
    // 20 1
    // 30 2
    // 40 3
    // 50 4
    return item === 50
})
console.log(index) // 4
const arr2 = [
    {
        name: '张三',
        age: 19
    },
    {
        name: '李四',
        age: 20
    },
    {
        name: '王五',
        age: 25
    },
]
console.log( arr2.findIndex(item => item.name === '李四') )  // 1

// find  查找元素  返回符合条件的对象，没有则返回 undefined
console.log( arr2.find(item => item.name === '李四') )  //  { name: '李四', age: 20 }

// every 检测数组所有元素是否都符合指定条件 ,都通过 true  否则 false
const ages = [12,15,14,19,20]
console.log(ages.every(item => item <= 18)) // false
console.log(ages.every(item => item >= 10)) // true

// some   检测数组中的元素是否满足指定条件  ,数组中有满足条件的  true 全部没有满足条件 false
console.log( arr2.some(item => item.name === '李四') ) // true
console.log( arr2.some(item => item.name === '客情') ) // false

// concat 合并两个数组，返回新数组,不修改原数组
let Arr1 = [1,2,3]
let Arr2 = [4,5,6]
console.log(Arr1.concat(Arr2) ) //  [ 1, 2, 3, 4, 5, 6 ]

// sort 数组排序  会修改原数组
let Arr3 = [9,2,5,6,1]
console.log(Arr3.sort()) // [ 1, 2, 5, 6, 9 ]

// splice 删除或替换原数组单元

// reverse 反转数组 会修改原数组
let Arr4 = ['卡拉','比丘']
console.log(Arr4.reverse())  // [ '比丘', '卡拉' ]
  